/*
 * @Copyright: 2023 - 2023 www.hoperun.com Inc. All rights reserved.
 */

package com.lifeservice.util;

import org.gavaghan.geodesy.Ellipsoid;
import org.gavaghan.geodesy.GeodeticCalculator;
import org.gavaghan.geodesy.GlobalCoordinates;

import java.math.BigDecimal;

/**
 * @author liu_yifeng
 * @function DistanceUtils
 * @date 2023/3/1 17:04
 */
public class DistanceUtils {
    /**
     * 根据经纬度，计算两点间的距离
     *
     * @param longitudeFrom 第一个点的经度
     * @param latitudeFrom  第一个点的纬度
     * @param longitudeTo   第二个点的经度
     * @param latitudeTo    第二个点的纬度
     * @return 返回距离 单位米
     */
    public static double getDistance(double longitudeFrom, double latitudeFrom, double longitudeTo, double latitudeTo) {
        GlobalCoordinates source = new GlobalCoordinates(latitudeFrom, longitudeFrom);
        GlobalCoordinates target = new GlobalCoordinates(latitudeTo, longitudeTo);
        return new GeodeticCalculator().calculateGeodeticCurve(Ellipsoid.Sphere, source, target).getEllipsoidalDistance();
    }

    /**
     * 根据经纬度，计算两点间的距离
     *
     * @param longitudeFrom 第一个点的经度
     * @param latitudeFrom  第一个点的纬度
     * @param longitudeTo   第二个点的经度
     * @param latitudeTo    第二个点的纬度
     * @param accurate      保留小数点几位
     * @return 返回距离 单位千米
     */
    public static double getDistance(double longitudeFrom, double latitudeFrom, double longitudeTo, double latitudeTo, int accurate) {
        double distance = getDistance(longitudeFrom, latitudeFrom, longitudeTo, latitudeTo);
        if (accurate < 0) {
            throw new RuntimeException("精确度必须是正整数或零");
        }
        return new BigDecimal(distance).divide(new BigDecimal(1000), accurate, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * 根据输入得值转化米或者千米
     *
     * @param input 输入值
     * @return 大于1000展示为KM
     */
    public static String convertMToKm(BigDecimal input) {
        if (null != input) {
            if (input.compareTo(new BigDecimal(1000)) == -1) {
                return input.toPlainString() + "m";
            } else {
                BigDecimal result = input.divide(new BigDecimal(1000), 2, BigDecimal.ROUND_HALF_UP);
                return result.toPlainString() + "km";
            }
        }
        return "";
    }
}
